package com.shlh.saas.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.shlh.saas.entity.UserBalance;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.time.LocalDateTime;

/**
 * 用户余额Mapper接口
 */
@Mapper
public interface UserBalanceMapper extends BaseMapper<UserBalance> {
    
    /**
     * 根据手机号查询用户余额信息
     * @param phone 手机号
     * @return 用户余额信息
     * @deprecated 使用 {@link #selectByUserId(Long)} 代替
     */
    @Select("SELECT * FROM user_balances WHERE phone = #{phone}")
    UserBalance selectByPhone(@Param("phone") String phone);
    
    /**
     * 根据用户ID查询用户余额信息
     * @param userId 用户ID
     * @return 用户余额信息
     */
    @Select("SELECT * FROM user_balances WHERE user_id = #{userId}")
    UserBalance selectByUserId(@Param("userId") Long userId);
    
    /**
     * 更新用户VIP等级
     * @param phone 手机号
     * @param vipLevel VIP等级
     * @return 影响的行数
     * @deprecated 使用 {@link #updateUserVipInfoById(Long, Integer)} 代替
     */
    @Update("UPDATE user_balances SET vip_level = #{vipLevel}, " +
            "updated_at = NOW() WHERE phone = #{phone}")
    int updateUserVipInfo(@Param("phone") String phone, 
                         @Param("vipLevel") Integer vipLevel);
    
    /**
     * 根据用户ID更新用户VIP等级
     * @param userId 用户ID
     * @param vipLevel VIP等级
     * @return 影响的行数
     */
    @Update("UPDATE user_balances SET vip_level = #{vipLevel}, " +
            "updated_at = NOW() WHERE user_id = #{userId}")
    int updateUserVipInfoById(@Param("userId") Long userId, 
                         @Param("vipLevel") Integer vipLevel);
    
    /**
     * 更新用户VIP信息和各种配额
     * @param phone 手机号
     * @param vipLevel VIP等级
     * @param exportQuota 导出次数
     * @param viewPages 查看页数
     * @param reverseLookup 反查次数
     * @return 影响的行数
     * @deprecated 使用 {@link #updateUserVipInfoWithQuotaById(Long, Integer, Integer, Integer, Integer)} 代替
     */
    @Update("UPDATE user_balances SET " +
            "vip_level = #{vipLevel}, " +
            "export_quota_remaining = #{exportQuota}, " +
            "view_pages_remaining = #{viewPages}, " +
            "reverse_lookup_remaining = #{reverseLookup}, " +
            "updated_at = NOW() " +
            "WHERE phone = #{phone}")
    int updateUserVipInfoWithQuota(
            @Param("phone") String phone, 
            @Param("vipLevel") Integer vipLevel, 
            @Param("exportQuota") Integer exportQuota,
            @Param("viewPages") Integer viewPages,
            @Param("reverseLookup") Integer reverseLookup);
    
    /**
     * 根据用户ID更新用户VIP信息和各种配额
     * @param userId 用户ID
     * @param vipLevel VIP等级
     * @param exportQuota 导出次数
     * @param viewPages 查看页数
     * @param reverseLookup 反查次数
     * @return 影响的行数
     */
    @Update("UPDATE user_balances SET " +
            "vip_level = #{vipLevel}, " +
            "export_quota_remaining = #{exportQuota}, " +
            "view_pages_remaining = #{viewPages}, " +
            "reverse_lookup_remaining = #{reverseLookup}, " +
            "updated_at = NOW() " +
            "WHERE user_id = #{userId}")
    int updateUserVipInfoWithQuotaById(
            @Param("userId") Long userId, 
            @Param("vipLevel") Integer vipLevel, 
            @Param("exportQuota") Integer exportQuota,
            @Param("viewPages") Integer viewPages,
            @Param("reverseLookup") Integer reverseLookup);
    
    /**
     * 增加用户邮件发送次数
     * @param phone 手机号
     * @param count 增加的次数
     * @return 影响的行数
     * @deprecated 使用 {@link #increaseEmailQuotaById(Long, Integer)} 代替
     */
    @Update("UPDATE user_balances SET email_send_remaining = email_send_remaining + #{count}, " +
            "updated_at = NOW() WHERE phone = #{phone}")
    int increaseEmailQuota(@Param("phone") String phone, @Param("count") Integer count);
    
    /**
     * 根据用户ID增加用户邮件发送次数
     * @param userId 用户ID
     * @param count 增加的次数
     * @return 影响的行数
     */
    @Update("UPDATE user_balances SET email_send_remaining = email_send_remaining + #{count}, " +
            "updated_at = NOW() WHERE user_id = #{userId}")
    int increaseEmailQuotaById(@Param("userId") Long userId, @Param("count") Integer count);
    
    /**
     * 更新用户邮件套餐等级
     * @param phone 手机号
     * @param packageLevel 邮件套餐等级
     * @return 影响的行数
     * @deprecated 使用 {@link #updateEmailPackageLevelById(Long, Integer)} 代替
     */
    @Update("UPDATE user_balances SET email_package_level = #{packageLevel}, " +
            "updated_at = NOW() WHERE phone = #{phone}")
    int updateEmailPackageLevel(@Param("phone") String phone, @Param("packageLevel") Integer packageLevel);
    
    /**
     * 根据用户ID更新用户邮件套餐等级
     * @param userId 用户ID
     * @param packageLevel 邮件套餐等级
     * @return 影响的行数
     */
    @Update("UPDATE user_balances SET email_package_level = #{packageLevel}, " +
            "updated_at = NOW() WHERE user_id = #{userId}")
    int updateEmailPackageLevelById(@Param("userId") Long userId, @Param("packageLevel") Integer packageLevel);
    
    /**
     * 更新用户VIP等级和到期时间
     * @param phone 手机号
     * @param vipLevel VIP等级
     * @param expireDate VIP到期时间
     * @return 影响的行数
     * @deprecated 使用 {@link #updateUserVipWithExpireDateById(Long, Integer, LocalDateTime)} 代替
     */
    @Update("UPDATE user_balances SET vip_level = #{vipLevel}, " +
            "vip_expire_time = #{expireDate}, " +
            "updated_at = NOW() WHERE phone = #{phone}")
    int updateUserVipWithExpireDate(@Param("phone") String phone, 
                         @Param("vipLevel") Integer vipLevel,
                         @Param("expireDate") LocalDateTime expireDate);
    
    /**
     * 根据用户ID更新用户VIP等级和到期时间
     * @param userId 用户ID
     * @param vipLevel VIP等级
     * @param expireDate VIP到期时间
     * @return 影响的行数
     */
    @Update("UPDATE user_balances SET vip_level = #{vipLevel}, " +
            "vip_expire_time = #{expireDate}, " +
            "updated_at = NOW() WHERE user_id = #{userId}")
    int updateUserVipWithExpireDateById(@Param("userId") Long userId, 
                         @Param("vipLevel") Integer vipLevel,
                         @Param("expireDate") LocalDateTime expireDate);
    
    /**
     * 根据用户ID更新用户邮件套餐过期时间
     * @param userId 用户ID
     * @param expireTime 过期时间
     * @return 影响的行数
     */
    @Update("UPDATE user_balances SET email_package_expire_time = #{expireTime}, " +
            "updated_at = NOW() WHERE user_id = #{userId}")
    int updateEmailPackageExpireTimeById(@Param("userId") Long userId, @Param("expireTime") LocalDateTime expireTime);
} 